#include "Reactor.hpp"
#include "Listener.hpp"
#include "Connection.hpp"

// ./select_server 8080
int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        std::cout << "Usage" << argv[0] << "port" << std::endl;
        return 1;
    }
    uint16_t local_port = std::stoi(argv[1]);
    Reactor reactor;

    auto conn=std::make_shared<Listener>(local_port);
    // Listener listen(local_port); // 完成具体工作的模块，也有一个listensockfd，此时就要添加到epoll中。
    // 我们要把listensockfd，封装成一个Coonection，然后Connection托管给epollserver。Connection只做链接管理。
    // 构建一个Connection
    //vesion-1
    // connection_t conn = std::make_shared<Connection>(listen.Sockfd());
    // // 初始化回调方法
    // conn->InitCB(
    //     [&listen]()
    //     {
    //         listen.Accepter();
    //     },
    //     nullptr,
    //     nullptr
    // );
    // conn->SetEvents(EPOLLIN|EPOLLET);//设置关心的事件。

    // //vesion-3
    // auto conn = std::make_shared<Connection>(listen.Sockfd());
    // func_t f = std::bind(&Listener::Accepter,&listen,conn,nullptr);
    // conn->InitCB(f,nullptr,nullptr);

    // //vesion-2——在Connection中再封装一个Factory类，专门用来初始化Connection，不暴露Connection。
    // auto conn =  Factory::BuildConnection(listen.Sockfd(),EPOLLIN|EPOLLET,
    // [&listen](std::shared_ptr<Connection> conn)
    //     {
    //         listen.Accepter(conn);
    //     },
    //     nullptr,
    //     nullptr);
    

    reactor.InsertConnetion(conn);
    reactor.Loop();

    return 0;
}

// int main()
// {
//     fd_set fds;
//     std::cout<<"fds:"<<sizeof(fds)*8<<std::endl;
// }